package com.lemon.boot.common.base;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lemon.boot.common.web.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @author 李猛
 * @datetime 2023/11/12 20:56
 * @description 公共的Controller
 */
public abstract class BaseController<P, D, S extends BaseService<P, D>> {
    @Autowired(required = false)
    protected S service;

    /**
     * 添加单条数据
     *
     * @param p
     * @return
     */
    @ApiOperation(value = "添加单条数据")
    @PostMapping("add")
    public String add(@RequestBody P p) {
        return service.add(p);
    }

    /**
     * 添加多条数据
     *
     * @param pList
     * @return
     */
    @ApiOperation(value = "添加多条数据")
    @PostMapping("adds")
    public String adds(@RequestBody List<P> pList) {
        return service.adds(pList);
    }

    /**
     * 根据ID删除数据
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "根据ID删除数据")
    @DeleteMapping("del/{id}")
    public String del(@PathVariable("id") Long id) {
        return service.del(id);
    }

    /**
     * 根据ID集合批量删除数据
     *
     * @param ids
     * @return
     */
    @ApiOperation(value = "根据ID集合批量删除数据")
    @DeleteMapping("del")
    public String del(@RequestParam Collection<Long> ids) {
        return service.del(ids);
    }

    /**
     * 根据ID修改数据（空字段不更新）
     *
     * @param p
     * @return
     */
    @ApiOperation(value = "根据ID修改数据（空字段不更新）")
    @PutMapping("edit")
    public String edit(@RequestBody P p) {
        return service.edit(p);
    }

    /**
     * 根据ID集合批量修改数据（空字段不更新）
     *
     * @param pList
     * @return
     */
    @ApiOperation(value = "根据ID集合批量修改数据（空字段不更新）")
    @PutMapping("edits")
    public String edits(@RequestBody List<P> pList) {
        return service.edits(pList);
    }

    /**
     * 新增或修改
     *
     * @param p
     * @return
     */
    @ApiOperation(value = "新增或修改")
    @RequestMapping(value = "addOrEdit", method = {RequestMethod.POST, RequestMethod.PUT})
    public String addOrEdit(@RequestBody P p) {
        return service.addOrEdit(p);
    }

    /**
     * 根据ID查询数据
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "根据ID查询数据")
    @GetMapping("get/{id}")
    public P get(@PathVariable("id") Long id) {
        return service.get(id);
    }

    /**
     * 根据ID集合查询列表数据
     *
     * @param ids
     * @return
     */
    @ApiOperation(value = "根据ID集合查询列表数据")
    @GetMapping("get")
    public List<P> get(@RequestParam Collection<Long> ids) {
        return service.get(ids);
    }

    /**
     * 根据Map集合查询分页数据
     *
     * @param map
     * @return
     */
    @ApiOperation(value = "根据Map集合查询分页数据")
    @GetMapping("map")
    public Page<P> map(@RequestParam Map<String, Object> map) {
        return service.map(map);
    }

    /**
     * 根据实体类查询列表数据
     *
     * @param d
     * @return
     */
    @ApiOperation(value = "根据实体类查询列表数据")
    @GetMapping("list")
    public List<?> list(D d) {
        return service.list(d);
    }

    /**
     * 根据实体类查询分页数据
     *
     * @param d
     * @return
     */
    @ApiOperation(value = "根据实体类查询分页数据")
    @GetMapping("page")
    public Page<?> page(D d) {
        return service.page(d);
    }

    /**
     * 根据实体类查询数据条数
     *
     * @param d
     * @return
     */
    @ApiOperation(value = "根据实体类查询数据条数")
    @GetMapping("count")
    public long count(D d) {
        return service.count(d);
    }

    /**
     * 根据实体类查询数据是否存在
     *
     * @param d
     * @return
     */
    @ApiOperation(value = "根据实体类查询数据是否存在")
    @GetMapping("exist")
    public boolean exist(D d) {
        return service.exist(d);
    }

    /**
     * 启用
     *
     * @param ids
     * @return
     */
    @ApiOperation(value = "启用")
    @PutMapping("enable")
    public String enable(@RequestBody Collection<Long> ids) {
        return service.enable(ids);
    }

    /**
     * 启用
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "启用")
    @PutMapping("enable/{id}")
    public String enable(@PathVariable("id") Long id) {
        return service.enable(Collections.singletonList(id));
    }

    /**
     * 停用
     *
     * @param ids
     * @return
     */
    @ApiOperation(value = "停用")
    @PutMapping("unable")
    public String unable(@RequestBody Collection<Long> ids) {
        return service.unable(ids);
    }

    /**
     * 停用
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "停用")
    @PutMapping("unable/{id}")
    public String unable(@PathVariable("id") Long id) {
        return service.unable(Collections.singletonList(id));
    }

    /**
     * 上传
     *
     * @param file
     * @return
     */
    @ApiOperation(value = "上传")
    @PostMapping("upload")
    public Result<?> upload(@RequestParam("file") MultipartFile file) {
        return service.upload(file);
    }

    /**
     * 导出
     *
     * @param d
     */
    @ApiOperation(value = "导出")
    @PostMapping("export")
    public void export(@RequestBody D d) {
        service.export(d);
    }
}
